char * strip_nastyhtml(const char * in);
char * convert_human_date_format(const char *human_datef); /* "MM,YYYY,DD" -> "%m,%Y,%d" */
char * convert_human_time_format(const char *human_timef); /* "HH+mm+ss" -> "%H+%M+%S" */
+char * pretty_deg_format(double lat, double lon, char fmt, int html); /* decimal -> dd.dddd or dd mm.mmm or dd mm ss */
/*
* Character encoding transformations.
static char *stylesheet = NULL;
static char *encrypt = NULL;
static char *includelogs = NULL;
+static char *degformat = NULL;
+static char *altunits = NULL;
#define MYNAME "HTML"
"Encrypt hints using ROT13", NULL, ARGTYPE_BOOL, ARG_NOMINMAX },
{ "logs", &includelogs,
"Include groundspeak logs if present", NULL, ARGTYPE_BOOL, ARG_NOMINMAX },
+ { "degformat", °format,
+ "Degrees output as 'ddd', 'dmm'(default) or 'dms'", "dmm", ARGTYPE_STRING, ARG_NOMINMAX },
+ { "altunits", &altunits,
+ "Units for altitude (f)eet or (m)etres", "m", ARGTYPE_STRING, ARG_NOMINMAX },
ARG_TERMINATOR
};
static void
html_disp(const waypoint *wpt)
{
- int latint, lonint;
char tbuf[1024];
+ char *cout;
time_t tm = wpt->creation_time;
gbint32 utmz;
double utme, utmn;
char utmzc;
fs_xml *fs_gpx = NULL;
- lonint = abs((int) wpt->longitude);
- latint = abs((int) wpt->latitude);
+
GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
&utme, &utmn, &utmz, &utmzc);
strftime(tbuf, sizeof(tbuf), "%d-%b-%Y", localtime(&tm));
- fprintf(file_out, "<hr>\n");
- fprintf(file_out, "<a name=\"%s\"></a><table width=\"100%%\"><tr><td>\n", wpt->shortname);
- fprintf(file_out, "<h3 class=\"waypoint\">%s - %c%d°%06.3f %c%d°%06.3f (%d%c %6.0f %7.0f)",
- (global_opts.synthesize_shortnames) ? mkshort_from_wpt(mkshort_handle, wpt) : wpt->shortname,
- wpt->latitude < 0 ? 'S' : 'N', latint, 60.0 * (fabs(wpt->latitude) - latint),
- wpt->longitude < 0 ? 'W' : 'E', lonint, 60.0 * (fabs(wpt->longitude) - lonint),
- utmz, utmzc, utme, utmn);
- if (wpt->altitude != unknown_alt)
- fprintf (file_out, " alt: %1.1f", wpt->altitude);
+ fprintf(file_out, "\n<a name=\"%s\"><hr></a>\n", wpt->shortname);
+ fprintf(file_out, "<table width=\"100%%\">\n");
+ fprintf(file_out, "<tr><td><p class=\"gpsbabelwaypoint\">%s - ",(global_opts.synthesize_shortnames) ? mkshort_from_wpt(mkshort_handle, wpt) : wpt->shortname);
+ cout = pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], 1);
+ fprintf(file_out, "%s (%d%c %6.0f %7.0f)", cout, utmz, utmzc, utme, utmn);
+ xfree (cout);
+ if (wpt->altitude != unknown_alt)
+ fprintf (file_out, " alt:%d", (int) ( (altunits[0]=='f')?METERS_TO_FEET(wpt->altitude):wpt->altitude) );
fprintf (file_out, "<br>\n");
-
if (strcmp(wpt->description, wpt->shortname)) {
if (wpt->url) {
char *d = html_entitize(wpt->description);
}
else {
fprintf(file_out, "%s", wpt->description);
+ }
+ if (wpt->gc_data.placer) {
+ fprintf(file_out, " by %s", wpt->gc_data.placer);
}
}
- fprintf(file_out, "</h3>\n");
+ fprintf(file_out, "</p></td>\n");
+
+ fprintf (file_out, "<td align=\"right\">");
if (wpt->gc_data.terr) {
- fprintf(file_out, "<p class=\"cachetype\">%s</p>\n",
- gs_get_cachetype(wpt->gc_data.type));
- fprintf(file_out, "<p class=\"cachecontainer\">%s</>\n",
+ fprintf (file_out, "<p class=\"gpsbabelcacheinfo\">%d%s / %d%s<br>\n",
+ (int)(wpt->gc_data.diff / 10), (wpt->gc_data.diff%10)?"½":"",
+ (int)(wpt->gc_data.terr / 10), (wpt->gc_data.terr%10)?"½":"" );
+ fprintf(file_out, "%s / %s</p>",
+ gs_get_cachetype(wpt->gc_data.type),
gs_get_container(wpt->gc_data.container));
- if (wpt->gc_data.desc_short.utfstring) {
- char *tmpstr = strip_nastyhtml(wpt->gc_data.desc_short.utfstring);
- fprintf (file_out, "<p class=\"descshort\">%s</p>\n", tmpstr );
- xfree( tmpstr );
- }
- if (wpt->gc_data.desc_long.utfstring) {
- char *tmpstr = strip_nastyhtml(wpt->gc_data.desc_long.utfstring);
- fprintf (file_out, "<p class=\"desclong\">%s</p>\n", tmpstr );
- xfree( tmpstr );
- }
- if (wpt->gc_data.hint) {
- char *hint = NULL;
- if ( encrypt )
- hint = rot13( wpt->gc_data.hint );
- else
- hint = xstrdup( wpt->gc_data.hint );
- fprintf (file_out, "<p class=\"hint\"><strong>Hint:</strong> %s</p>\n", hint);
- xfree( hint );
- }
+ }
+ fprintf(file_out, "</td></tr>\n");
+
+
+ fprintf(file_out, "<tr><td colspan=\"2\">");
+ if (wpt->gc_data.desc_short.utfstring) {
+ char *tmpstr = strip_nastyhtml(wpt->gc_data.desc_short.utfstring);
+ fprintf (file_out, "<p class=\"gpsbabeldescshort\">%s</p>\n", tmpstr );
+ xfree( tmpstr );
+ }
+ if (wpt->gc_data.desc_long.utfstring) {
+ char *tmpstr = strip_nastyhtml(wpt->gc_data.desc_long.utfstring);
+ fprintf (file_out, "<p class=\"gpsbabeldesclong\">%s</p>\n", tmpstr );
+ xfree( tmpstr );
+ }
+ if (wpt->gc_data.hint) {
+ char *hint = NULL;
+ if ( encrypt )
+ hint = rot13( wpt->gc_data.hint );
+ else
+ hint = xstrdup( wpt->gc_data.hint );
+ fprintf (file_out, "<p class=\"gpsbabelhint\"><strong>Hint:</strong> %s</p>\n", hint);
+ xfree( hint );
}
else if (wpt->notes && (!wpt->description || strcmp(wpt->notes,wpt->description))) {
- fprintf (file_out, "<p class=\"notes\">%s</p>\n", wpt->notes);
+ fprintf (file_out, "<p class=\"gpsbabelnotes\">%s</p>\n", wpt->notes);
}
fs_gpx = NULL;
while ( curlog ) {
time_t logtime = 0;
struct tm *logtm = NULL;
- fprintf( file_out, "<p class=\"log\">\n" );
+ fprintf( file_out, "<p class=\"gpsbabellog\">\n" );
logpart = xml_findfirst( curlog, "groundspeak:type" );
if ( logpart ) {
- fprintf( file_out, "<span class=\"logtype\">%s</span> by ", logpart->cdata );
+ fprintf( file_out, "<span class=\"gpsbabellogtype\">%s</span> by ", logpart->cdata );
}
logpart = xml_findfirst( curlog, "groundspeak:finder" );
if ( logpart ) {
char *f = html_entitize( logpart->cdata );
- fprintf( file_out, "<span class=\"logfinder\">%s</span> on ", f );
+ fprintf( file_out, "<span class=\"gpsbabellogfinder\">%s</span> on ", f );
xfree( f );
}
logtm = localtime( &logtime );
if ( logtm ) {
fprintf( file_out,
- "<span class=\"logdate\">%2.2d/%2.2d/%4.4d</span><br>\n",
+ "<span class=\"gpsbabellogdate\">%04d-%02d-%02d</span><br>\n",
+ logtm->tm_year+1900,
logtm->tm_mon+1,
- logtm->tm_mday,
- logtm->tm_year+1900
- );
+ logtm->tm_mday );
}
}
if ( logpart ) {
char *coordstr = NULL;
float lat = 0;
- int latdeg = 0;
float lon = 0;
- int londeg = 0;
coordstr = xml_attribute( logpart, "lat" );
if ( coordstr ) {
lat = atof( coordstr );
if ( coordstr ) {
lon = atof( coordstr );
}
- latdeg = abs(lat);
- londeg = abs(lon);
-
+ coordstr = pretty_deg_format(lat, lon, degformat[2], 1);
fprintf( file_out,
- "<span class=\"logcoords\">%c %d° %.3f' %c %d° %.3f'</span><br>\n",
-
- lat < 0 ? 'S' : 'N', latdeg, 60.0 * (fabs(lat) - latdeg),
- lon < 0 ? 'W' : 'E', londeg, 60.0 * (fabs(lon) - londeg)
- );
+ "<span class=\"gpsbabellogcoords\">%s</span><br>\n",
+ coordstr );
+ xfree(coordstr);
}
logpart = xml_findfirst( curlog, "groundspeak:text" );
fprintf(file_out, "<html>\n");
fprintf(file_out, "<head>\n");
fprintf(file_out, " <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">\n");
+ fprintf(file_out, " <meta name=\"Generator\" content=\"GPSBabel %s\">\n", gpsbabel_version);
fprintf(file_out, " <title>GPSBabel HTML Output</title>\n");
- fprintf(file_out, " <meta name=\"Generator\" content=\"GPSBabel\">\n");
if (stylesheet)
fprintf(file_out, " <link rel=\"stylesheet\" type=\"text/css\" href=\"%s\">\n", stylesheet);
+ else {
+ fprintf(file_out, " <style>\n");
+ fprintf(file_out, " p.gpsbabelwaypoint { font-size: 120%%; font-weight: bold }\n");
+ fprintf(file_out, " </style>\n");
+ }
fprintf(file_out, "</head>\n");
fprintf(file_out, "<body>\n");
static char *suppresssep = NULL;
static char *encrypt = NULL;
static char *includelogs = NULL;
+static char *degformat = NULL;
+static char *altunits = NULL;
#define MYNAME "TEXT"
{ "encrypt", &encrypt,
"Encrypt hints using ROT13", NULL, ARGTYPE_BOOL, ARG_NOMINMAX },
{ "logs", &includelogs,
- "Include groundspeak logs if present", NULL, ARGTYPE_BOOL, ARG_NOMINMAX },
+ "Include groundspeak logs if present", NULL, ARGTYPE_BOOL, ARG_NOMINMAX },
+ { "degformat", °format,
+ "Degrees output as 'ddd', 'dmm'(default) or 'dms'", "dmm", ARGTYPE_STRING, ARG_NOMINMAX },
+ { "altunits", &altunits,
+ "Units for altitude (f)eet or (m)etres", "m", ARGTYPE_STRING, ARG_NOMINMAX },
+
ARG_TERMINATOR
};
gbint32 utmz;
double utme, utmn;
char utmzc;
+ char *tmpout1, *tmpout2;
+ char *altout;
fs_xml *fs_gpx;
lonint = abs((int) wpt->longitude);
tm = time(NULL);
strftime(tbuf, sizeof(tbuf), "%d-%b-%Y", localtime(&tm));
- gbfprintf(file_out, "%-16s %c%d %06.3f %c%d %06.3f (%d%c %6.0f %7.0f)",
+ tmpout1 = pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], 0);
+ if (wpt->altitude != unknown_alt) {
+ xasprintf(&altout, " alt:%d", (int) ( (altunits[0]=='f')?METERS_TO_FEET(wpt->altitude):wpt->altitude) );
+ }
+ else {
+ altout = "";
+ }
+ xasprintf (&tmpout2, "%s (%d%c %6.0f %7.0f)%s", tmpout1, utmz, utmzc, utme, utmn, altout );
+ gbfprintf(file_out, "%-16s %59s\n",
(global_opts.synthesize_shortnames) ? mkshort_from_wpt(mkshort_handle, wpt) : wpt->shortname,
- wpt->latitude < 0 ? 'S' : 'N', abs(latint), 60.0 * (fabs(wpt->latitude) - latint),
- wpt->longitude < 0 ? 'W' : 'E', abs(lonint), 60.0 * (fabs(wpt->longitude) - lonint),
- utmz, utmzc, utme, utmn);
- if (wpt->altitude != unknown_alt)
- gbfprintf (file_out, " alt: %1.1f", wpt->altitude);
- gbfprintf (file_out, "\n");
+ tmpout2);
+ xfree(tmpout2);
+ xfree(tmpout1);
+ if (altout[0])
+ xfree(altout);
+
+
if (strcmp(wpt->description, wpt->shortname)) {
- gbfprintf(file_out, "%s\n", wpt->description);
- }
- if (wpt->gc_data.terr) {
- gbfprintf(file_out, "%s/%s\n",
- gs_get_cachetype(wpt->gc_data.type), gs_get_container(wpt->gc_data.container));
+ gbfprintf(file_out, "%s", wpt->description);
+ if (wpt->gc_data.placer)
+ gbfprintf(file_out, " by %s", wpt->gc_data.placer);
+ }
+ if (wpt->gc_data.terr) {
+ gbfprintf(file_out, " - %s / %s - (%d%s / %d%s)\n",
+ gs_get_cachetype(wpt->gc_data.type), gs_get_container(wpt->gc_data.container),
+ (int)(wpt->gc_data.diff / 10), (wpt->gc_data.diff%10)?".5":"",
+ (int)(wpt->gc_data.terr / 10), (wpt->gc_data.terr%10)?".5":"" );
if (wpt->gc_data.desc_short.utfstring) {
char *stripped_html = strip_html(&wpt->gc_data.desc_short);
gbfprintf (file_out, "\n%s\n", stripped_html);
}
}
else if (wpt->notes && (!wpt->description || strcmp(wpt->notes,wpt->description))) {
- gbfprintf (file_out, "%s\n", wpt->notes);
+ gbfprintf (file_out, "\n%s\n", wpt->notes);
}
fs_gpx = NULL;
logtm = localtime( &logtime );
if ( logtm ) {
gbfprintf( file_out,
- "%2.2d/%2.2d/%4.4d\n",
+ "%4.4d-%2.2d-%2.2d\n",
+ logtm->tm_year+1900,
logtm->tm_mon+1,
- logtm->tm_mday,
- logtm->tm_year+1900
- );
+ logtm->tm_mday );
}
}
if ( logpart ) {
char *coordstr = NULL;
float lat = 0;
- int latdeg = 0;
float lon = 0;
- int londeg = 0;
coordstr = xml_attribute( logpart, "lat" );
if ( coordstr ) {
lat = atof( coordstr );
if ( coordstr ) {
lon = atof( coordstr );
}
- latdeg = abs(lat);
- londeg = abs(lon);
-
- gbfprintf( file_out,
- "%c %d %.3f' %c %d %.3f'\n",
-
- lat < 0 ? 'S' : 'N', latdeg, 60.0 * (fabs(lat) - latdeg),
- lon < 0 ? 'W' : 'E', londeg, 60.0 * (fabs(lon) - londeg)
- );
+ coordstr = pretty_deg_format(lat, lon, degformat[2], 0);
+ gbfprintf( file_out, "%s\n", coordstr);
+ xfree(coordstr);
}
logpart = xml_findfirst( curlog, "groundspeak:text" );
}
}
if (! suppresssep)
- gbfprintf(file_out, "-----------------------------------------------------------------------------\n");
+ gbfprintf(file_out, "\n-----------------------------------------------------------------------------\n");
else
gbfprintf(file_out, "\n");
return result;
}
+
+/*
+ * Return a decimal degree pair as
+ * DD.DDDDD DD MM.MMM or DD MM SS.S
+ * fmt = ['d', 'm', 's']
+ * html = 1 for html output otherwise text
+ */
+char *
+pretty_deg_format(double lat, double lon, char fmt, int html)
+{
+ double latmin, lonmin, latsec, lonsec;
+ int latint, lonint;
+ char latsig, lonsig;
+ char *result;
+ latsig = lat < 0 ? 'S':'N';
+ lonsig = lon < 0 ? 'W':'E';
+ latint = abs((int) lat);
+ lonint = abs((int) lon);
+ latmin = 60.0 * (fabs(lat) - latint);
+ lonmin = 60.0 * (fabs(lon) - lonint);
+ latsec = 60.0 * (latmin - floor(latmin));
+ lonsec = 60.0 * (lonmin - floor(lonmin));
+ if (fmt == 'd') { /* ddd */
+ xasprintf ( &result, "%c%6.5f%s %c%6.5f%s",
+ latsig, fabs(lat), html?"°":"",
+ lonsig, fabs(lon), html?"°":"" );
+ }
+ else if (fmt == 's') { /* dms */
+ xasprintf ( &result, "%c%d%s%02d'%04.1f\" %c%d%s%02d'%04.1f\"",
+ latsig, latint, html?"°":" ", (int)latmin, latsec,
+ lonsig, lonint, html?"°":" ", (int)lonmin, lonsec);
+ }
+ else { /* default dmm */
+ xasprintf ( &result, "%c%d%s%06.3f %c%d%s%06.3f",
+ latsig, latint, html?"°":" ", latmin,
+ lonsig, lonint, html?"°":" ", lonmin);
+ }
+ return result;
+}
+
+
+
/*
* Get rid of potentially nasty HTML that would influence another record
* that includes;
- * <body> - to stop backgrounds from being loaded
+ * <body> - to stop backgrounds/background colours from being loaded
* </body> and </html>- stop processing altogether
* <style> </style> - stop overriding styles for everything
*/
sp = returnstr = xstrdup(in);
lcp = lcstr = strlower(xstrdup(in));
- while (lcp = strstr(lcstr, "<body"), NULL != lcp) { /* becomes <---- */
+ while (lcp = strstr(lcstr, "<body>"), NULL != lcp) {
+ sp = returnstr + (lcp - lcstr) ; /* becomes <! > */
+ sp++; *sp++ = '!'; *sp++ = ' '; *sp++ = ' '; *sp++ = ' ';
+ *lcp = '*'; /* so we wont find it again */
+ }
+ while (lcp = strstr(lcstr, "<body"), lcp != NULL) { /* becomes <!-- --> */
sp = returnstr + (lcp - lcstr) ;
- sp++; *sp++ = '-'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-';
+ sp++; *sp++ = '!'; *sp++ = '-'; *sp++ = '-';
+ while ( (*sp) && (*sp != '>') ) {
+ sp++;
+ }
+ *--sp = '-'; *--sp = '-';
*lcp = '*'; /* so we wont find it again */
}
- while (lcp = strstr(lcstr, "</body"), NULL != lcp) {
- sp = returnstr + (lcp - lcstr) ; /* becomes </---- */
- sp++; sp++; *sp++ = '-'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-';
+ while (lcp = strstr(lcstr, "</body>"), NULL != lcp) {
+ sp = returnstr + (lcp - lcstr) ; /* becomes <!---- */
+ sp++; *sp++ = '!'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-';
*lcp = '*'; /* so we wont find it again */
}
- while (lcp = strstr(lcstr, "</html"), NULL != lcp) {
+ while (lcp = strstr(lcstr, "</html>"), NULL != lcp) {
sp = returnstr + (lcp - lcstr) ; /* becomes </---- */
- sp++; sp++; *sp++ = '-'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-';
+ sp++; *sp++ = '!'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-'; *sp++ = '-';
*lcp = '*'; /* so we wont find it again */
}
while (lcp = strstr(lcstr, "<style"), NULL != lcp) {
--- /dev/null
+<para>
+When this option is zero, no labels are added for track and route points.
+This option defaults to one, so labels are added by default.
+</para>
--- /dev/null
+<para>
+ This option allows you to specify the number of points kept
+ in the 'snail trail' generated in the realtime tracking mode.
+</para>